插播一篇我自己在工作上遇到的問題
我相信不會只有我遇到
提供給大家問題分析及解決流程
日後若遇到可以有個對照方式去處理
狀況是這樣的
我接手了一個前輩的單機程式
vs工具開發, 語言是C#
這程式原本都好好的
沒什麼發病
突然有一天牙起來
使用者反映程式跳了一個視窗
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
於是乎我就去檢查他電腦裡是不是有安裝Word
結果勒, 不只有裝, 還裝到了Office 2016
連我自己電腦裡都只有2010的
好吧, 看來要來Debug了...
要除蟲必先抓蟲
老實說這程式交與我手, 也從來沒把整段程式看完過xD
碼海茫茫要如何找到我想要的
幸好, 已經有線索了
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
咱來Ctrl+F再Ctrl+V一下
果然馬上找到, 真棒
而在跳出這個錯誤訊息之前
有一段程式去檢測了 Word的登錄碼
目前檢測了 2010 & 2013 & 2016 三種版本是否存在登錄碼
且在我本機(有安裝Office 2010)執行
確實可以抓的到akey_2010
這個RegistryKey
但, 使用者電腦的是Office 2016...
於是我只好忍痛砍了我的2010
再見了2010, 你好啊2016~
安裝完之後再來執行一次程式
竟然!!!!!
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
我有裝Office你別跟我抱歉阿!!
實際開了Word確認看看是不是真的有裝好
真的裝好了...
到底為什麼抓不到登錄碼...
自己想破頭也找不到原因, 只好請教估狗大神
而估狗大神也完美的幫我找到了解答
看的懂嗎? 我英文初級都沒過是看不太懂, 所以我用了機翻
這樣應該勉強能看懂
原因出在程式本身開發時就設定32位元
32位元環境下程式碼就自動編譯了這個路徑
多了WoW6432Node這段
那多了這段, 想當然爾, 身為64位元的Office 2016是絕對抓不到的
於是乎, 這蟲就這麼給抓到了
抓到了蟲, 要怎麼除呢?
首先程式肯定是要改成64位元可以使用的
於是平台的部分原本是x86
就改為Any CPU
但不改還好, 改下去夭壽, 一窩蜂問題立馬跑出來
還好我還扛的住
有發現問題都出自同一人之手
就是 Microsoft.Office.Core
不要問我怎麼知道的
只要把他的參考原為14.0更新成16.0就好
更新更起來!!
你以為結束了嗎? 我以為是, 但卻還沒結束
因為我家是用Oracle DB
, 就牽涉到了 Provider的問題
原本的Provider是 MSDAORA.1
但因為MSDAORA
只支援32位元
所以要換個可以支援64位元的Provider - OraOLEDB.Oracle
這問題就能解決了!!
於是我啟動了程式, 執行也沒問題, 也不再跳錯誤了, 完美!!
你以為結束了嗎? 這麼簡單我還要發這篇文嗎?
本來是可以就這樣結束結案掉的
誰知道!!在我裝回Office2010之後竟然又跳出來
"抱歉!此功能必須安裝Microsoft Office 2010以上方可使用!"
我的天哪!!
就在我瀕臨崩潰之際, 一道光從我天靈蓋噴出來
原來我千算萬算, 卻漏算了它 - WoW6432Node
我們已經知道在64位元時的路徑是這樣:
SOFTWARE\Microsoft\Office\14.0\Word\InstallRoot\
而32位元時路徑會被自動轉譯成這樣:
SOFTWARE\WoW6432Node\Microsoft\Office\14.0\Word\InstallRoot\
所以當我在x64
時要去抓32位元的Office, 當然也是抓不到
因為64位元沒有自動轉譯阿!!!
最後我在檢測登錄碼的地方加上了32位元的檢測路徑
程式總算是不再跟我抱歉了...
解這問題花了我大半天時間...
也讓我學到蠻多東西
而且也不能說是前輩寫的Code有問題
在當時的環境下, 可能就只能用32位元
說不準幾年後出了128位元 256位元
我們開發的64位元系統也被後輩拿來嘴
共勉之~